package com.fishingwithme.android.ui.screens.map.handlers

import com.fishingwithme.android.R

/**
 * 跳转到当前位置处理器 - 通用处理器（空实现）
 */
class JumpToCurrentLocationEventHandler : BaseHandler() {
    override val key: String = "jumpToCurrentLocation"
    override val icon: Int = R.mipmap.cp  // 保持原有的位置图标

    // 用于跟踪位置请求，防止重复请求
    private var isRequestingLocation = false

    override fun doAction() {
        // 获取当前上下文
        val context = this.context ?: return

        // 检查权限
        if (!hasLocationPermissions(context)) {
            // 如果没有权限，可以在这里处理权限请求
            return
        }

        // 防止重复请求
        if (isRequestingLocation) return
        isRequestingLocation = true

        // 尝试快速获取当前位置并移动地图
        getCurrentLocationQuickly(context) { location ->
            isRequestingLocation = false
            location?.let { latLng ->
                try {
                    // 移动地图到当前位置
                    map?.moveCamera(
                        com.tencent.tencentmap.mapsdk.maps.CameraUpdateFactory.newLatLngZoom(
                            com.tencent.tencentmap.mapsdk.maps.model.LatLng(
                                latLng.first,
                                latLng.second
                            ),
                            15f // 设置合适的缩放级别
                        )
                    )

                    // 可选：在当前位置添加标记
                    val markerOptions = com.tencent.tencentmap.mapsdk.maps.model.MarkerOptions(
                        com.tencent.tencentmap.mapsdk.maps.model.LatLng(latLng.first, latLng.second)
                    ).apply {
                        title("当前位置")
                        snippet("这是您的当前位置")
                    }
                    map?.addMarker(markerOptions)?.showInfoWindow()
                } catch (e: Exception) {
                    android.util.Log.w(
                        "JumpToCurrentLocation",
                        "Error updating map with current location",
                        e
                    )
                }
            }
        }
    }

    /**
     * 检查是否有位置权限
     */
    private fun hasLocationPermissions(context: android.content.Context): Boolean {
        val hasFine = androidx.core.content.ContextCompat.checkSelfPermission(
            context,
            android.Manifest.permission.ACCESS_FINE_LOCATION
        ) == android.content.pm.PackageManager.PERMISSION_GRANTED

        val hasCoarse = androidx.core.content.ContextCompat.checkSelfPermission(
            context,
            android.Manifest.permission.ACCESS_COARSE_LOCATION
        ) == android.content.pm.PackageManager.PERMISSION_GRANTED

        return hasFine || hasCoarse
    }

    /**
     * 快速获取当前位置（不追求精确度）
     */
    private fun getCurrentLocationQuickly(
        context: android.content.Context,
        callback: (Pair<Double, Double>?) -> Unit
    ) {
        val locationManager =
            context.getSystemService(android.content.Context.LOCATION_SERVICE) as android.location.LocationManager

        // 首先尝试获取最后已知位置（即使不精确也足够）
        val providers = locationManager.getProviders(true)
        for (provider in providers) {
            try {
                // 添加异常处理以防止崩溃
                val location = locationManager.getLastKnownLocation(provider)
                if (location != null) {
                    callback(Pair(location.latitude, location.longitude))
                    return
                }
            } catch (e: SecurityException) {
                // 权限不足，继续尝试其他提供者
                android.util.Log.w(
                    "JumpToCurrentLocation",
                    "权限不足，无法获取 $provider 的位置信息",
                    e
                )
            } catch (e: Exception) {
                // 其他异常，继续尝试其他提供者
                android.util.Log.w(
                    "JumpToCurrentLocation",
                    "获取 $provider 的位置信息时出错",
                    e
                )
            }
        }

        // 如果没有最后已知位置，快速请求一次位置更新
        val locationListener = object : android.location.LocationListener {
            override fun onLocationChanged(location: android.location.Location) {
                callback(Pair(location.latitude, location.longitude))
                // 移除位置监听器
                try {
                    locationManager.removeUpdates(this)
                } catch (e: Exception) {
                    // 忽略移除监听器时的异常
                    android.util.Log.w("JumpToCurrentLocation", "移除位置监听器时出错", e)
                }
            }

            override fun onStatusChanged(
                provider: String?,
                status: Int,
                extras: android.os.Bundle?
            ) {
            }

            override fun onProviderEnabled(provider: String) {}
            override fun onProviderDisabled(provider: String) {
                callback(null)
            }
        }

        // 快速请求位置更新
        try {
            if (providers.isNotEmpty()) {
                // 使用第一个可用的提供者
                val provider = providers.first()
                locationManager.requestLocationUpdates(
                    provider,
                    0L, // 最小时间间隔
                    0f, // 最小距离
                    locationListener
                )

                // 设置较短的超时（因为不需要精确位置）
                android.os.Handler(android.os.Looper.getMainLooper()).postDelayed({
                    try {
                        locationManager.removeUpdates(locationListener)
                    } catch (e: Exception) {
                        // 忽略移除监听器时的异常
                        android.util.Log.w(
                            "JumpToCurrentLocation",
                            "超时移除位置监听器时出错",
                            e
                        )
                    }
                    // 即使超时也返回null，不强制要求精确位置
                    callback(null)
                }, 5000) // 5秒超时就足够了
            } else {
                callback(null)
            }
        } catch (e: SecurityException) {
            android.util.Log.e("JumpToCurrentLocation", "请求位置更新时权限不足", e)
            callback(null)
        } catch (e: Exception) {
            android.util.Log.e("JumpToCurrentLocation", "请求位置更新时出错", e)
            callback(null)
        }
    }
}